GET_NAMED_MEMORY_RETAIN-Baustein

Derzeit ist der GET_NAMED_MEMORY_RETAIN-Baustein analog zum GET_NAMED_MEMORY-Baustein, wobei GET_NAMED_MEMORY_RETAIN die Referenz auf einen anderen Speicherbereich als GET_NAMED_MEMORY liefert (siehe "Beispiel mit Referenz auf anderen Speicherbereich").

Der GET_NAMED_MEMORY_RETAIN-Baustein liefert die →Referenz auf einen →gepufferten Speicherbereich, dessen Namen Sie am Eingang NAME eingeben. Mit Hilfe des SAVE_ALL_NAMED_MEMORY_RETAIN-Bausteins oder des SAVE_NAMED_MEMORY_RETAIN-Bausteins ist es möglich, alle gepufferten Speicherbereiche oder nur einen in den permanenten Speicher zu speichern.
Standardmäßig wird die entsprechende Datei im Unterverzeichnis PLC des Neuron RTS max-Installationsverzeichnisses abgelegt. Falls Sie die Ablage in einem anderem Verzeichnis bevorzugen, kontaktieren Sie Ihren Systemintegrator und bitten Sie darum, die Konfiguration des Systemdiensts zu ändern.

Kurz-Information

Name

GET_NAMED_MEMORY_RETAIN

→POE-Typ

→Funktion

Kategorie

Standard (non-safe), MemoryEnh, Baustein mit interner Fehlerdiagnose

Konform zur →IEC-Norm

(Plus) nicht in IEC-Norm vorgesehen

Grafische Schnittstelle

Verfügbar ab

Version 1.53.0 (für Neuron Power Engineer) und Version 3.0.8 oder 2.3.1801 von Neuron RTS max - Anfangsvariante
(Warnung) Dieser Baustein wird nur für die integrierte SPS unterstützt.

Version 1.109.0 (für Neuron Power Engineer) und Version 3.19.0 von Neuron RTS max: liefert die Referenz auf gleichen Speicherbereich wie GET_NAMED_MEMORY
 Dieser Baustein wird nur für die integrierte SPS und die Plattformen WindowsX86 und LinuxX86 unterstützt.

Version 3.2.2 (für Bibliothek Standard) – Erweiterung: breitere Schnittstelle; liefert die Referenz auf anderen Speicherbereich als GET_NAMED_MEMORY

Version 3.8.0 (für Bibliothek Standard (non-safe)): Baustein in diese Bibliothek verschoben

Beispiel mit Referenz auf anderen Speicherbereich

Das folgende Beispiel enthält 2 Programminstanzen: eine schreibt einen Konfigurationswert in einen gepufferten Speicherbereich mit einem Namen, die andere liest ihn aus:

CONFIGURATION LocalConfiguration
  RESOURCE local ON BuiltInPlc { ON_CHANNEL := LocalChannel }
    TASK DefaultTask(INTERVAL := TIME#500ms, PRIORITY := 38229);
    PROGRAM ProgramInstance1 WITH DefaultTask :
      Program1;
    PROGRAM ProgramInstance2 WITH DefaultTask :
      Program2;
  END_RESOURCE
END_CONFIGURATION

Da der Programmtyp Program2 fälschlicherweise GET_NAMED_MEMORY() verwendet, um den benannten Speicherbereich anzufordern. wird eine andere Referenz als erwartet geliefert:

PROGRAM Program1
  VAR
    ReferenceToInteger : REF_TO INT;
  END_VAR
 
  ReferenceToInteger := GET_NAMED_MEMORY_RETAIN('IntegerBlock');
  IF ReferenceToInteger <> NULL THEN
    ReferenceToInteger^ := 42;
  END_IF;
END_PROGRAM
 
PROGRAM Program2
  VAR
    ReferenceToInteger : REF_TO INT;
  END_VAR
    
  ReferenceToInteger := GET_NAMED_MEMORY('IntegerBlock');
  IF ReferenceToInteger <> NULL THEN
    /* The following assertion will fail since 'Program2' erroneously requested
     * a named memory block that is NOT retained, thus gets a different block
     * than 'Program1'. For this reason, the value stored in the block is not '42' as
     * expected, but the initial value of zero...
    */
  Assert(ReferenceToInteger^ = 42);
  END_IF;
END_PROGRAM

Um das Problem zu beheben, müssen Sie den Aufruf GET_NAMED_MEMORY() durch den Aufruf GET_NAMED_MEMORY_RETAIN() ersetzen.